<?php
namespace app\admin\controller;

use app\common\lib\gee_test_lib\GeeTestLib;
use think\Controller;
use think\Db;
use think\Session;

class Login extends Controller{
    /**
     * 会员登录
     * @author 王柯 <wangke.email@foxmail.com>
     * @return array|mixed|string|\think\response\Json
     */
    public function index(){
        //检测Session是否存在
        $isLogin = Session::get('book_user');
        if($isLogin){
            $this->redirect('index/index');
        }

        if(request()->isAjax()){
            $data = $_POST;

            $users =  Db::name('user')
                ->alias('user')
                ->join('auth_group group','user.user_auth=group.id','LEFT')
                ->where('user.username="'.$data['username'].'" OR user.tel="'.$data['username'].'"')
                ->field('user.*,group.title,group.rules')
                ->find();

            if(!$users){
                return show(config('code.error'),'账号不存在！');
            }else{
                //验证密码
                if(md5($data['password']) != $users['password']){
                    return show(config('code.error'),'密码错误！');
                }

                if (!captcha_check($data['code'])) {
                    return show(config('code.error'),'验证码错误！');
                } else{
                    if($users['stop_status'] == 1){

                        $user = Db::name('user')
                            ->alias('user')
                            ->join('auth_group auth','user.id=auth.id','LEFT')
                            ->where('user.id='.$users['id'])
                            ->field('user.*,auth.title')
                            ->find();

                        //记录登录时间、登录ip
                        if (getenv("HTTP_X_FORWARDED_FOR"))
                        {
                            $ip = getenv("HTTP_X_FORWARDED_FOR");
                        }
                        elseif (getenv("HTTP_CLIENT_IP"))
                        {
                            $ip = getenv("HTTP_CLIENT_IP");
                        }
                        elseif (getenv("REMOTE_ADDR"))
                        {
                            $ip = getenv("REMOTE_ADDR");
                        }
                        else
                        {
                            $ip = "Unknown";
                        }

                        //更新登录数据
                        $login = [
                            'login_time' => time(),
                            'login_ip' => $ip,
                        ];

                        Db::name('user')->where('id='.$users['id'])->setInc('times');

                        Db::name('user')->where('id='.$users['id'])->update($login);

                        Session::set('book_u',$user);

                        return show(config('code.success'),'登录成功！');
                    }else if($users['stop_status'] == 0){
                        return show(config('code.error'),'账户已停用，请联系管理员！');
                    }
                }
            }
        }

        return $this->fetch('login');
    }

    /**
     * 切换账号
     * @author 王柯 <wangke.email@foxmail.com>
     * @return void
     */
    public function change_account(){
        Session::delete('book_user');
        $Session = Session::has('book_user');
        if($Session === false){
            $this->redirect('login/index');
        }
    }

    /**
     * 用户退出
     * @author 王柯 <wangke.email@foxmail.com>
     * @return \think\response\Json
     */
    public function logout(){

        Session::delete('book_user');

        $Session = Session::has('book_user');

        if($Session === false){
            $this->redirect('login/index');
        }

        return show(config('code.error'),'退出失败');
    }


    /**
     * 使用Get的方式返回：challenge和capthca_id 此方式以实现前后端完全分离的开发模式 专门实现failback
     * @author 王柯 <wangke.email@foxmail.com>
     * @return void
     */
    public function StartCaptchaServlet(){
        $GtSdk = new GeeTestLib(config('code.CAPTCHA_ID'), config('code.PRIVATE_KEY'));
        session_start();

        $users = $_GET;
        $data = array(
            "user_id" => $users['username'], # 网站用户id
            "client_type" => "web", #web:电脑上的浏览器；h5:手机上的浏览器，包括移动应用内完全内置的web_view；native：通过原生SDK植入APP应用的方式
            "ip_address" => "127.0.0.1" # 请在此处传输用户请求验证时所携带的IP
        );

        $status = $GtSdk->pre_process($data, 1);
        $_SESSION['gtserver'] = $status;
        $_SESSION['user_id'] = $data['user_id'];
        echo $GtSdk->get_response_str();
    }

    /**
     * 输出二次验证结果,本文件示例只是简单的输出 Yes or No
     * @author 王柯 <wangke.email@foxmail.com>
     * @return void
     */
    public function VerifyLoginServlet(){

        session_start();
        $GtSdk = new GeetestLib(config('code.CAPTCHA_ID'), config('code.PRIVATE_KEY'));

        $data = array(
            "user_id" => $_SESSION['user_id'], # 网站用户id
            "client_type" => "web", #web:电脑上的浏览器；h5:手机上的浏览器，包括移动应用内完全内置的web_view；native：通过原生SDK植入APP应用的方式
            "ip_address" => "127.0.0.1" # 请在此处传输用户请求验证时所携带的IP
        );

        $users =  Db::name('user')
            ->where('username="'.$_POST['username'].'" OR tel="'.$_POST['username'].'"')
            ->find();

        if(!$users){
            return show(config('code.error'),'账号不存在！');
        }elseif(md5($_POST['password']) != $users['password']){
            return show(config('code.error'),'密码错误！');
        }

        if ($_SESSION['gtserver'] == 1) {   //服务器正常
            $result = $GtSdk->success_validate($_POST['geetest_challenge'], $_POST['geetest_validate'], $_POST['geetest_seccode'], $data);


            if ($result) {
                if($users['stop_status'] == 1){

                    $user = Db::name('user')
                        ->alias('user')
                        ->join('auth_group auth','user.id=auth.id','LEFT')
                        ->where('user.id='.$users['id'])
                        ->field('user.*,auth.title')
                        ->find();

                    //记录登录时间、登录ip
                    if (getenv("HTTP_X_FORWARDED_FOR"))
                    {
                        $ip = getenv("HTTP_X_FORWARDED_FOR");
                    }
                    elseif (getenv("HTTP_CLIENT_IP"))
                    {
                        $ip = getenv("HTTP_CLIENT_IP");
                    }
                    elseif (getenv("REMOTE_ADDR"))
                    {
                        $ip = getenv("REMOTE_ADDR");
                    }
                    else
                    {
                        $ip = "Unknown";
                    }

                    //更新登录数据
                    $login = [
                        'login_time' => time(),
                        'login_ip' => $ip,
                    ];

                    Db::name('user')->where('id='.$users['id'])->setInc('times');

                    Db::name('user')->where('id='.$users['id'])->update($login);

                    Session::set('book_user',$user);

                    return show(config('code.success'),'登录成功！');
                }else if($users['stop_status'] == 0){
                    return show(config('code.error'),'账户已停用，请联系管理员！');
                }

                return show(config('code.success'),'验证成功！');
            } else{
                return show(config('code.error'),'验证失败！');
            }
        }else{  //服务器宕机,走failback模式
            if ($GtSdk->fail_validate($_POST['geetest_challenge'],$_POST['geetest_validate'],$_POST['geetest_seccode'])) {
                if($users['stop_status'] == 1){

                    $user = Db::name('user')
                        ->alias('user')
                        ->join('auth_group auth','user.id=auth.id','LEFT')
                        ->where('user.id='.$users['id'])
                        ->field('user.*,auth.title')
                        ->find();

                    //记录登录时间、登录ip
                    if (getenv("HTTP_X_FORWARDED_FOR"))
                    {
                        $ip = getenv("HTTP_X_FORWARDED_FOR");
                    }
                    elseif (getenv("HTTP_CLIENT_IP"))
                    {
                        $ip = getenv("HTTP_CLIENT_IP");
                    }
                    elseif (getenv("REMOTE_ADDR"))
                    {
                        $ip = getenv("REMOTE_ADDR");
                    }
                    else
                    {
                        $ip = "Unknown";
                    }

                    //更新登录数据
                    $login = [
                        'login_time' => time(),
                        'login_ip' => $ip,
                    ];

                    Db::name('user')->where('id='.$users['id'])->setInc('times');

                    Db::name('user')->where('id='.$users['id'])->update($login);

                    Session::set('book_u',$user);

                    return show(config('code.success'),'登录成功！');
                }else if($users['stop_status'] == 0){
                    return show(config('code.error'),'账户已停用，请联系管理员！');
                }

                return show(config('code.success'),'验证成功！');
            }else{
                return show(config('code.error'),'验证失败！');
            }
        }
    }


}
